package lc.weekly;

/**
 * 第 76 场双周赛
 * <p>
 * 本场竞赛由「中控技术 & 力扣」联合主办
 * <p>
 * https://leetcode-cn.com/contest/biweekly-contest-76
 */
public interface BiweeklyContest76 {

    /**
     * 6060. 找到最接近 0 的数字
     *
     * <p>
     * 给你一个长度为 n 的整数数组 nums ，请你返回 nums 中最 接近 0 的数字。如果有多个答案，请你返回它们中的 最大值
     * <p>
     * 提示：
     * <ul>
     *     <li>1 <= n <= 1000</li>
     *     <li>-10<sup>5</sup> <= nums[i] <= 10<sup>5</sup></li>
     * </ul>
     *
     * @param nums
     * @return
     */
    int findClosestNumber(int[] nums);

    /**
     * 6061. 买钢笔和铅笔的方案数
     * <p>
     * <p>
     * 给你一个整数total，表示你拥有的总钱数。同时给你两个整数cost1 和cost2，分别表示一支钢笔和一支铅笔的价格。你可以花费你部分或者全部的钱，去买任意数目的两种笔。
     * <p>
     * 请你返回购买钢笔和铅笔的不同方案数目。
     * <p>
     * 提示：
     * <ul>
     *     <li>1 <= total, cost1, cost2 <= 10<sup>6</sup></li>
     * </ul>
     *
     * @param total
     * @param cost1
     * @param cost2
     * @return
     */
    long waysToBuyPensPencils(int total, int cost1, int cost2);

    interface ATM {

        /**
         * @param banknotesCount 分别存入$20，$50，$100，$200和$500钞票的数目。
         */
        void deposit(int[] banknotesCount);

        /**
         * 返回一个长度为5的数组，分别表示$20，$50，$100，$200和$500钞票的数目，并且更新 ATM 机里取款后钞票的剩余数量。如果无法取出指定数额的钱，请返回[-1]（这种情况下 不取出任何钞票）。
         *
         * @param amount
         * @return
         */
        int[] withdraw(int amount);
    }

    /**
     * 6062. 设计一个 ATM 机器
     * <p>
     * <p>
     * 一个 ATM 机器，存有5种面值的钞票：20，50，100，200和500美元。初始时，ATM 机是空的。用户可以用它存或者取任意数目的钱。
     * <p>
     * 取款时，机器会优先取 较大数额的钱。
     * <ul>
     *     <li>比方说，你想取$300，并且机器里有2张 $50的钞票，1张$100的钞票和1张$200的钞票，那么机器会取出$100 和$200的钞票。</li>
     *     <li>但是，如果你想取$600，机器里有3张$200的钞票和1张$500的钞票，那么取款请求会被拒绝，因为机器会先取出$500的钞票，然后无法取出剩余的$100。注意，因为有$500钞票的存在，机器不能取$200的钞票。</li>
     * </ul>
     * 请你实现 ATM 类
     * <p>
     * 提示：
     * <ul>
     *     <li>banknotesCount.length == 5</li>
     *     <li>0 <= banknotesCount[i] <= 10<sup>9</sup></li>
     *     <li>1 <= amount <= 10<sup>9</sup></li>
     *     <li>总共最多有5000次withdraw 和deposit的调用。</li>
     *     <li>函数 withdraw 和deposit至少各有 一次调用。</li>
     * </ul>
     *
     * @return 实现的ATM 类
     */
    ATM atm();

    /**
     * 6063. 节点序列的最大得分
     * <p>
     * <p>
     * 给你一个n个节点的无向图，节点编号为0到n - 1。
     * <p>
     * 给你一个下标从 0开始的整数数组scores，其中scores[i]是第 i个节点的分数。同时给你一个二维整数数组edges，其中edges[i] = [ai, bi]，表示节点ai 和bi之间有一条无向边。
     * <p>
     * 一个合法的节点序列如果满足以下条件，我们称它是 合法的：
     * <ul>
     *     <li>序列中每相邻节点之间有边相连。</li>
     *     <li>序列中没有节点出现超过一次。</li>
     * </ul>
     * 节点序列的分数定义为序列中节点分数之 和 。
     * <p>
     * 请你返回一个长度为 4的合法节点序列的最大分数。如果不存在这样的序列，请你返回 -1。
     * <p>
     * 提示：
     * <ul>
     *     <li>n == scores.length</li>
     *     <li>4 <= n <= 5 * 10<sup>4</sup></li>
     *     <li>1 <= scores[i] <= 10<sup>8</sup></li>
     *     <li>0 <= edges.length <= 5 * 10<sup>4</sup></li>
     *     <li>edges[i].length == 2</li>
     *     <li>0 <= ai, bi <= n - 1</li>
     *     <li>ai != bi</li>
     *     <li>不会有重边。</li>
     * </ul>
     *
     * @param scores
     * @param edges
     * @return
     */
    int maximumScore(int[] scores, int[][] edges);

}
